package com.tiancheng.trade.order.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.tiancheng.trade.commom.core.data.PageInfo;
import com.tiancheng.trade.commom.core.data.Result;
import com.tiancheng.trade.commom.core.data.notify.PaySubFlowResultMsgBO;
import com.tiancheng.trade.commom.core.exception.BusinessException;
import com.tiancheng.trade.order.bo.SubOrderBO;
import com.tiancheng.trade.order.bo.SubOrderRefundBO;
import com.tiancheng.trade.order.bo.cmq.ScrmSubOrders;
import com.tiancheng.trade.order.bo.notify.PayResultSubOrderBO;
import com.tiancheng.trade.order.model.SubOrder;
import com.tiancheng.trade.order.model.join.SubOrderJoin;
import com.tiancheng.trade.order.vo.admin.QuerySubOrderVO;
import com.tiancheng.trade.order.vo.admin.res.SubOrderDetailResVO;
import com.tiancheng.trade.order.vo.admin.res.SubOrderResVO;
import com.tiancheng.trade.order.vo.api.ReportOrderStatusVO;
import com.tiancheng.trade.order.vo.api.UpdateOrderVO;
import com.tiancheng.trade.order.vo.api.VerificationOrderVO;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @Auther: ld
 * @Date: 2024/2/28 15:55
 * @Param ${tags}
 * @Description: 子订单Service接口
 */
public interface SubOrderService extends IService<SubOrder> {

    PageInfo<SubOrderResVO> querySubOrderList(QuerySubOrderVO subOrderVO);

    /**
     * 子订单导出
     */
    Result exportOrderList(QuerySubOrderVO subOrderVO, HttpServletResponse response) throws IOException;

    /**
     * 创建子订单
     *
     * @param subOrderBOS
     * @return
     * @throws BusinessException
     */
    List<SubOrder> create(List<SubOrderBO> subOrderBOS) throws BusinessException;

    /**
     * 子订单已支付
     *
     * @param orderId 主订单号
     * @param subFlows 子订单流水
     * @param couponAmount 优惠金额
     * @return
     * @throws BusinessException
     */
    List<PayResultSubOrderBO> paid(String orderId, List<PaySubFlowResultMsgBO> subFlows, Integer couponAmount, String payStatus) throws BusinessException;

    /**
     * 修改子订单金额
     *
     * @param updateOrderVO
     * @throws BusinessException
     */
    List<SubOrder> updateAmount(UpdateOrderVO updateOrderVO) throws BusinessException;

    /**
     * 查询主订单下的子订单列表
     *
     * @param orderIds
     * @return
     */
    List<SubOrder> find(String[] orderIds);

    /**
     * 查询可以退款的子订单
     *
     * @param orderId
     * @param subOrderIds
     * @return
     */
    List<SubOrder> findCanRefund(String orderId, String[] subOrderIds);

    /**
     * 根据子订单id查询单笔子订单数据
     *
     * @param subId
     * @return
     */
    SubOrder findBySubId(String subId);

    /**
     * 子订单发起退款
     *
     * @param subOrderIds
     * @return
     */
    int refundIng(String[] subOrderIds);

    /**
     * 子订单退款结果
     *
     * @param subOrderRefundBOS
     * @return
     */
    int refund(List<SubOrderRefundBO> subOrderRefundBOS);

    /**
     * 根据主订单id查询子订单信息
     *
     * @param orderId
     * @return
     */
    List<SubOrder> findByOrderId(String orderId);

    SubOrderDetailResVO findSubOrderBySubId(String subId);

    /**
     * 子订单业务侧状态流转处理
     *
     * @param orderId
     * @param subOrderId
     * @param bizStatus
     * @throws BusinessException
     */
    void statusFlow(String orderId, String[] subOrderId, String bizStatus) throws BusinessException;

    /**
     * 获取指定子订单，并关联主订单、优惠券
     *
     * @param subOrderId
     * @return
     */
    SubOrderJoin getWithJoin(String subOrderId);

    /**
     * 按月查询子订单信息
     *
     * @param date
     * @return
     */
    List<SubOrder> findSubOrderByDate(String date);

    /**
     * 查询主订单下指定的子订单
     *
     * @param orderId
     * @param subOrderIds
     * @return
     */
    List<SubOrder> find(String orderId, String[] subOrderIds);

    /**
     * 核销订单
     *
     * @param date
     * @return
     */
    Map<String, Object> verification(VerificationOrderVO date);

    /**
     * 查询核销失败的订单
     *
     * @return
     */
    List<SubOrder> verificationErrorOrder();

    /**
     * 订单状态上报
     * @param date
     */
    void reportOrderStatus(ReportOrderStatusVO date);

    List<ScrmSubOrders> queryScrmSubOrders(Collection<String> orderIds,Collection<String> subOrderIds);
}
